(算法)字典序数列
题目:
给定正整数N,要求对1~N的所有数按照字典序来排列,
如:
1-10:1 10 2 3 4 5 6 7 8 9
1-100:1 10 100 11 12 13 14 15 16 17 18 19 2 20 21 ......
思路:
1、字符串排序
将1~N所有数字转为字符串,存进vector<string>中,对vector进行排序,结果就是字典序的数列。
2、递归
先对数字最高位开始,最高位有1-9的选择,从1-9开始,如果该数不大于n,则加入数组,然后依次乘以10进入递归,
然后进入递归,因为后面的位有0-9的选择,从0-9开始,如果该数不大于n,则加入数组,然后依次乘以10进入递归。
详见代码。
代码:
#include<iostream> #include<vector> using namespace std; void recursive(int m,vector<int> &arr,int n){ if(m>n) return; for(int i=0;i<=9;i++){ if(m+i<=n){ arr.push_back(m+i); recursive(m*10,arr,n); } } } void SortByDict(int n,vector<int> &arr){ for(int i=1;i<=9;i++){ if(i<=n){ arr.push_back(i); recursive(i*10,arr,n); } } } int main(){ int n; while(cin>>n){ vector<int> arr; SortByDict(n,arr); for(int i=0;i<n;i++) cout<<arr[i]<<" "; cout<<endl; } return 0; }